Go言語(golang)でS3へファイルをアップロードする
データアナリティクス事業本部の森脇です。
今回はaws-sdk-goを使って、S3へファイルをアップロードする方法についてご紹介したいと思います。
使用するGo言語のバージョンは1.13.6です。
前回ご紹介した、S3からファイルを取得する方法はこちら。
aws-sdk-goをインストールする
前回と同様、modulesを使ってaws-sdk-goをインストールします。
$ go mod init example.com/moriwaki/s3write go: creating new go.mod: module example.com/moriwaki/s3write $ go get -u github.com/aws/aws-sdk-go go: finding github.com/aws/aws-sdk-go v1.28.9 go: downloading github.com/aws/aws-sdk-go v1.28.9 go: extracting github.com/aws/aws-sdk-go v1.28.9 $ cat go.mod module example.com/moriwaki/s3write go 1.13 require github.com/aws/aws-sdk-go v1.28.9 // indirect
今回はv1.28.9がインストールされました。
作っていく
main.goというファイルを作成し、実装していきます。
AWSのクレデンシャルは、aws-cliなどを使って事前に設定しておきます。
sessionを作成する
S3に接続するためにのsessionを作成します。
package main import ( "github.com/aws/aws-sdk-go/aws/session" ) func main() { // sessionの作成 sess := session.Must(session.NewSessionWithOptions(session.Options{ Profile: "di", SharedConfigState: session.SharedConfigEnable, })) }
「SharedConfigState」オプションの意味は、前回ご紹介した記事を参照ください。
S3にファイルをアップロードする
main.goと同じ階層に「sample.txt」というファイルを作成し、こちらをアップロードしてみます。
アップロードにはs3managerのUploaderを使用します。
package main import ( "log" "os" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/s3/s3manager" ) func main() { // sessionの作成 sess := session.Must(session.NewSessionWithOptions(session.Options{ Profile: "di", SharedConfigState: session.SharedConfigEnable, })) // ファイルを開く targetFilePath := "./sample.txt" file, err := os.Open(targetFilePath) if err != nil { log.Fatal(err) } defer file.Close() bucketName := "xxx-bucket" objectKey := "xxx-key" // Uploaderを作成し、ローカルファイルをアップロード uploader := s3manager.NewUploader(sess) _, err = uploader.Upload(&s3manager.UploadInput{ Bucket: aws.String(bucketName), Key: aws.String(objectKey), Body: file, }) if err != nil { log.Fatal(err) } log.Println("done") }
実行してみます。
$ go run main.go 2020/01/31 13:36:01 done
エラーが発生することなく、実行が完了しました。
Upload関数の引数に指定しているBodyの型はio.Readerのため、 ローカルファイル以外でも簡単にアップロードできそうです。
まとめ
aws-sdk-goを使うことで、簡単にローカルのファイルをアップロードすることができました。
次回はGo言語を使った文字コード変換を実践したいと思います。